# -*- coding:utf-8 -*-
# 验证码:图片验证码,短信验证码

import re
import logging
import random
import json
from . import api
from flask import request, abort, current_app, jsonify, make_response
from iHome.utils.captcha.captcha import captcha
from iHome import redis_store
from iHome import constants
from iHome.utils.response_code import RET
from iHome.utils.SendTemplateSMS import CCP
from iHome.models import User


@api.route('/imagecode')
def get_image_code():
    '''
    1.取到图片编码
    2.生成图片验证码
    3.存储到redis中(key是图片编码,值是验证码的文字
    4.返回图片
    :return:
    '''

    # 1.取到图片编码
    args = request.args
    cur = args.get('cur')
    pre = args.get('pre')

    # 如果用户没有传图片id的话,直接抛错
    if not cur:
        abort(403)

    # 2.生成图片验证码
    _, text, image = captcha.generate_captcha()
    # 为了测试输入到控制台中
    current_app.logger.debug(text)
    # 3.存储到redis中(key是图片编码,值是验证码的文字内容）
    try:
        # 删除之前的验证码信息
        if pre:
            redis_store.delete('ImageCode_' + pre)
        # 保存当前的验证码信息
        redis_store.set(
            "ImageCode_" + cur,
            text,
            constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        # 返回响应内容
        return jsonify(error=RET.DBERR, errmsg="保存图片验证码失败")
    # 4.返回验证码图片
    response = make_response(image)
    # TODO:设置contentType
    response.headers['Content-Type'] = 'image/jpg'
    return response


@api.route('/smscode/', methods=["POST"])
def send_sms_code():

    # 1.获取参数
    # param_dict = json.loads(request.get_data())
    param_dict = request.get_json()
    mobile = param_dict['mobile']
    image_code = param_dict['text']
    image_code_id = param_dict['id']

    # 2.验证参数是否为空
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3.验证手机号是否合法
    if not re.match(r"^1[34578][0-9]{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号不合法')
# 4.验证图片验证码是否正确
    try:
        real_image_code = redis_store.get('ImageCode_' + image_code_id)
        # 3.1 删除redis中的图片验证码内容
        redis_store.delete('ImageCode_' + image_code_id)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据异常')
    # 4.1 判断验证码是否存在
    if not real_image_code:
        return jsonify(errno=RET.DATAERR, errmsg='验证码已过期')

    # 4.2 比较传入的验证码和本地验证码是否一致
    if image_code.lower() != real_image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')
    # 4.3 判断当前手机号是否注册过,如果注册过,直接返回错误
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        # 一旦进入到exception里面的话,如果没有定义user的话,代表会往下执行
        # 往下执行的过程中会取判断user是否存在,如果user没有定义,会抛出未定义的异常
        user = None
        current_app.logger.error(e)
    if user:
        return jsonify(errno=RET.DATAERR, errmsg="当前手机号已注册")

    # 5.生成短信验证码
    sms_code = "%06d" % random.randint(0, 1000000)
    print(sms_code)
    # 6.发送验证码
    result = CCP().send_template_sms(
        mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], '1')
    if result == 0:
        return jsonify(errno=RET.THIRDERR, errmsg='发送验证码失败')
    try:
        # 7.存储验证码内容以便后续校验
        redis_store.setex(
            'SMSCode_' + mobile,
            constants.SMS_CODE_REDIS_EXPIRES,
            sms_code)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')
    # 8.发送成功
    return jsonify(errno=RET.OK, errmsg='发送验证码成功')
